
package com.hc.util;

import java.util.List;
import java.util.Map;

import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.GeoRadiusResponse;
import redis.clients.jedis.GeoUnit;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
/**
* 
* @Description: 操作redis实现存放、删除、设置过期时间的存放，无须归还资源,自动实现
* @author  Young
* @date 2016年11月25日 上午10:40:48  
*
 */
public class Redis {

	private ShardedJedisPool shardedJedisPool;
	
	/**
	 * 不允许实例化
	 */
    protected Redis() {  
    	  
    } 
	
	/**
	 * 
	 * @Description： 通过key获取Redis中的Value，自动释放资源
	 * @param key 存放时的key
	 * @return 存放时的value
	 * @author:  
	 * @since: 2016年11月24日
	 */
	public String get(String key){
		String value = null;
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			value = jedis.get(key);
		} catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		} finally {
			jedis.close();
		}
		return value;
	}
	/**
	 * 
	 * @Description： 通过key获取Redis中的Value，自动释放资源
	 * @param key 存放时的key
	 * @return 存放时的value
	 * @author:  
	 * @since: 2016年11月24日
	 */
	public byte[] get(byte[] bytes){
		byte[] value = null;
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			value = jedis.get(bytes);
		} catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		} finally {
			jedis.close();
		}
		return value;
	}
	/**
	 * 
	 * @Description： 存放值，成功返回1，失败返回0
	 * @param key
	 * @param value
	 * @return int 0：1
	 * @author:  
	 * @since: 2016年11月24日 
	 */
	public int set(String key,String value) {
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return "OK".equals(jedis.set(key, value))?1:0;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 存放值，成功返回1，失败返回0
	 * @param key
	 * @param value
	 * @return int 0：1
	 * @author:  
	 * @since: 2016年11月24日 
	 */
	public int set(byte[] key,byte[] value) {
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return "OK".equals(jedis.set(key, value))?1:0;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 存放值，并设置过期时间。成功返回1，失败返回0
	 * @param key
	 * @param value
	 * @param second s秒 
	 * @return
	 * @author:  
	 * @since: 2016年11月24日 下午6:46:18
	 */
	public int setEx(byte[] key,int second,byte[] value){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return "OK".equals(jedis.setex(key,second,value))?1:0;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 存放值，并设置过期时间。成功返回1，失败返回0
	 * @param key
	 * @param value
	 * @param second s秒 
	 * @return
	 * @author:  
	 * @since: 2016年11月24日 下午6:46:18
	 */
	public int setEx(String key, int second,String value){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return "OK".equals(jedis.setex(key,second,value))?1:0;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 删除某个值
	 * @param key
	 * @author:  
	 * @since: 2016年11月25日
	 */
	public void del(byte[] key){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			if (jedis.get(key)!=null){
				jedis.del(key);
			}
		}catch (Exception e) {
			LoggerUtil.error(e);
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 删除某个值
	 * @param key
	 * @author:  
	 * @since: 2016年11月25日
	 */
	public void del(String key){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			if (jedis.get(key)!=null){
				jedis.del(key);
			}
		}catch (Exception e) {
			LoggerUtil.error(e);
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 添加坐标地址
	 * @param key 
	 * @param longitude 经度
	 * @param latitude 纬度
	 * @param member 
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午12:05:11
	 */
	public long geoAdd(String key,double longitude,double latitude, String member){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.geoadd(key, longitude, latitude, member);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 添加坐标地址
	 * @param key 
	 * @param longitude 经度
	 * @param latitude 纬度
	 * @param member 
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午12:06:26
	 */
	public long geoAdd(byte[] key,double longitude,double latitude, byte[] member){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.geoadd(key, longitude, latitude, member);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 添加坐标地址
	 * @author:
	 * @param key
	 * @param longitude
	 * @param latitude
	 * @param memberCoordinateMap
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年12月19日 下午5:45:46
	 */
	public long geoAdd(String key,double longitude,double latitude, Map<String, GeoCoordinate> memberCoordinateMap){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.geoadd(key, memberCoordinateMap);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 添加坐标地址
	 * @author:
	 * @param key
	 * @param longitude
	 * @param latitude
	 * @param memberCoordinateMap
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年12月19日 下午5:45:46
	 */
	public long geoAdd(byte[] key,double longitude,double latitude, Map<byte[], GeoCoordinate> memberCoordinateMap){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.geoadd(key, memberCoordinateMap);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 获取两个地理位置距离（非坐标点距离）
	 * @author:
	 * @param key 
	 * @param dis1 地理位置1
	 * @param dis2 地理位置2
	 * @param unit GeoUnit.(M, KM, MI, FT);
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午12:11:25
	 */
	public double geoGetDistance(String key,String dis1,String dis2,GeoUnit unit){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.geodist(key, dis1, dis2, unit);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 获取两个地理位置距离（非坐标点距离）
	 * @author:
	 * @param key 
	 * @param dis1 地理位置1
	 * @param dis2 地理位置2
	 * @param unit GeoUnit.(M, KM, MI, FT);
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午12:11:25
	 */
	public double geoGetDistance(byte[] key,byte[] dis1,byte[] dis2,GeoUnit unit){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.geodist(key, dis1, dis2, unit);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 获取多个地理位置GeoHash，也可以只获取单个
	 * @author:
	 * @param key 
	 * @param members 地标
	 * @return 按传入顺序依次对应各个GeoHash
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午2:49:05
	 */
	public List<String> geoGetHash(String key,String... members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			List<String> GeoHashs = jedis.geohash(key, members);
			return GeoHashs;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 获取多个地理位置GeoHash，也可以只获取单个
	 * @author:
	 * @param key 
	 * @param members 地标
	 * @return 按传入顺序依次对应各个GeoHash
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午2:49:05
	 */
	public List<byte[]> geoGetHash(byte[] key,byte[]... members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			List<byte[]> GeoHashs = jedis.geohash(key, members);
			return GeoHashs;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 获取位置的坐标
	 * @author:
	 * @param key
	 * @param members
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午3:00:24
	 */
	public List<GeoCoordinate> geoGetPosition(String key,String...members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			List<GeoCoordinate> pos = jedis.geopos(key, members);
			return pos;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 获取位置的坐标
	 * @author:
	 * @param key
	 * @param members
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午3:00:56
	 */
	public List<GeoCoordinate> geoGetPosition(byte[] key,byte[]...members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			List<GeoCoordinate> pos = jedis.geopos(key, members);
			return pos;
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 通过坐标获取附近坐标地址
	 * @author:
	 * @param key
	 * @param longitude 经度
	 * @param latitude 纬度
	 * @param radius 范围
	 * @param unit GeoUnit.(M, KM, MI, FT);
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午3:03:37
	 */
	public List<GeoRadiusResponse> geoGetRadius(String key,double longitude,double latitude,int radius,GeoUnit unit){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.georadius(key, longitude, latitude, radius, unit);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description：通过坐标获取附近坐标地址
	 * @author:
	 * @param key
	 * @param longitude 经度
	 * @param latitude 纬度
	 * @param radius 范围
	 * @param unit GeoUnit.(M, KM, MI, FT);
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午3:03:37
	 */
	public List<GeoRadiusResponse> geoGetRadius(byte[] key,double longitude,double latitude,int radius,GeoUnit unit){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.georadius(key, longitude, latitude, radius, unit);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 通过位置查询附近的记录点信息
	 * @author:
	 * @param key
	 * @param member 位置
	 * @param radius 范围
	 * @param unit GeoUnit.(M, KM, MI, FT);
	 * @return List<GeoRadiusResponse>
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午3:26:53
	 */
	public List<GeoRadiusResponse> geoGetRadiusByMember(String key,String member,int radius,GeoUnit unit){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.georadiusByMember(key, member, radius, unit);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 通过位置查询附近的记录点信息
	 * @author:
	 * @param key
	 * @param member 位置
	 * @param radius 范围
	 * @param unit GeoUnit.(M, KM, MI, FT);
	 * @return List<GeoRadiusResponse>
	 * @Version: 1.0 
	 * @since: 2016年11月29日 下午3:26:53
	 */
	public List<GeoRadiusResponse> geoGetRadiusByMember(byte[] key,byte[] member,int radius,GeoUnit unit){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.georadiusByMember(key, member, radius, unit);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description：当且仅当key已经存在于redis中时，存入新的value，返回旧的value，如果key不存在则直接返回null
	 * @param key 
	 * @param value
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月30日 下午2:50:19
	 */
	public String getSet(String key, String value){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.getSet(key, value);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description：当且仅当key已经存在于redis中时，存入新的value，返回旧的value，如果key不存在则直接返回null
	 * @param key 
	 * @param value
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月30日 下午2:50:19
	 */
	public byte[] getSet(byte[] key, byte[] value){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.getSet(key, value);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return null;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 删除某个区域下的member
	 * @author:
	 * @param key
	 * @param members
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月30日 下午5:17:33
	 */
	public long geoReomve(String key,String members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.zrem(key, members);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 删除某个区域下的member
	 * @author:
	 * @param key
	 * @param members
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月30日 下午5:17:33
	 */
	public long geoReomve(byte[] key,byte[] members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.zrem(key, members);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	
	/**
	 * 
	 * @Description： 删除某个区域下的多个member
	 * @author:
	 * @param key
	 * @param members
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月30日 下午5:17:33
	 */
	public long geoReomve(String key,String...members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.zrem(key, members);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}
	/**
	 * 
	 * @Description： 删除某个区域下的多个member
	 * @author:
	 * @param key
	 * @param members
	 * @return
	 * @Version: 1.0 
	 * @since: 2016年11月30日 下午5:17:33
	 */
	public long geoReomve(byte[] key,byte[]...members){
		ShardedJedis jedis = null;
		try{
			jedis = shardedJedisPool.getResource();
			return jedis.zrem(key, members);
		}catch (Exception e) {
			LoggerUtil.error(e);
			return 0;
		}finally {
			jedis.close();
		}
	}

	public void setShardedJedisPool(ShardedJedisPool shardedJedisPool) {
		this.shardedJedisPool = shardedJedisPool;
	}
}

